package com.lancoo.edu.platform.operation.commons.utils;

import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import org.apache.commons.collections.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * 集合工具类
 * @author pky
 */
public class ListUtil {

    /**
     * 从 List<A> copy 到 List<B>
     * @param sourceList 原列表
     * @param clazz 要转换的类型
     * @param <T> 指定类型
     * @return 拷贝成功后的List
     */
    public static <T> List<T> copy(List<?> sourceList, Class<T> clazz) {
        return BeanUtil.copyToList(sourceList, clazz);
    }

    /**
     * 从对象A copy到 对象B
     *
     * @param source    A
     * @param clazz B.class
     * @return B
     */
    public static <T> T copy(Object source, Class<T> clazz) {
        String sourceStr = JSON.toJSONString(source);
        return JSON.parseObject(sourceStr, clazz);
    }

    /**
     * 校验集合是否全部为空
     * @param lists 集合列表
     * @return true/全部为空；false/存在不为空集合
     */
    public static  boolean checkAllEmpty(List ... lists) {
        for(List list : lists) {
            if(CollectionUtils.isNotEmpty(list)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 为了实现根据对象中某一属性对集合去重
     * @param keyExtractor 接口方法参数
     * @param <T> 泛型
     * @return 接口方法参数
     */
    public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
}
